package com.general.framework.core.exception;

import com.general.framework.core.lang.Strings;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Objects;

/**
 * @author leejean
 * 异常工具创建类，用于快速抛出异常.
 */
public class Ex {

    /**
     * 创建一个业务异常,使用{}作为占位符打印参数
     */
    public static BusinessException business(ICode errorCode) {
        return new BusinessException(errorCode);
    }
    /**
     * 创建一个业务异常,使用{}作为占位符打印参数
     */
    public static BusinessException business(Integer code, String msg, Object... params) {
        return new BusinessException(code, buildMessage(msg, params));
    }

    /**
     * 创建一个业务异常,使用{}作为占位符打印参数
     *
     */
    public static BusinessException business(String msg, Object... params) {
        return new BusinessException(CodeEnum.BUSINESS_ERROR.getCode(), buildMessage(msg, params));
    }

    /**
     * 创建一个RPC调用异常,使用{}作为占位符打印参数
     */
    public static FeignResponseException invokeError(ICode errorCode) {
        return new FeignResponseException(errorCode);
    }

    /**
     * 创建一个RPC调用异常,使用{}作为占位符打印参数
     */
    public static FeignResponseException invokeError(Integer code, String msg, Object... params) {
        return new FeignResponseException(code, buildMessage(msg, params));
    }

    /**
     * 创建一个RPC调用异常,使用{}作为占位符打印参数
     *
     */
    public static FeignResponseException invokeError(String msg, Object... params) {
        return new FeignResponseException(CodeEnum.RPC_ERROR.getCode(), buildMessage(msg, params));
    }

    /**
     * 创建一个验证异常,使用{}作为占位符打印参数
     */
    public static ViolationException violation(String msg, Object... params) {
        return new ViolationException(buildMessage(msg, params));
    }

    /**
     * 创建一个系统错误异常,使用{}作为占位符打印参数
     */
    public static SystemErrorException systemError(Throwable throwable, String msg, Object... params) {
        String message = buildMessage(msg, params);
        if (Strings.isNotBlank(message)) {
            return new SystemErrorException(message, throwable);
        }
        return new SystemErrorException(throwable);
    }

    /**
     * 创建一个系统错误异常,使用{}作为占位符打印参数
     */
    public static SystemErrorException systemError(String msg, Object... params) {
        String message = buildMessage(msg, params);
        return new SystemErrorException(message);
    }

    /**
     * 创建一个系统错误异常
     */
    public static SystemErrorException systemError() {
        return new SystemErrorException(CodeEnum.SYSTEM_ERROR);
    }


    /**
     * 将ErrorStack转化为String.
     */
    public static String getStackTraceAsString(final Throwable throwable) {
        if (throwable == null) {
            return "";
        }
        final StringWriter stringWriter = new StringWriter();
        throwable.printStackTrace(new PrintWriter(stringWriter));
        return stringWriter.toString();
    }

    /**
     * 构建格化式消息,使用{}作为占位符打印参数
     * @param msg    指定消息模板
     * @param params 指定消息模板参数
     * @return
     */
    private static String buildMessage(String msg, Object... params) {
        if (Objects.isNull(msg)) {
            return Strings.EMPTY;
        }
        return Strings.format(msg, params);
    }

}
